package com.zy.design.demo.behavioral;

/**
 * 策略模式
 * 特点：定义一系列算法，封装起来，使它们可以互换。
 */
// 策略接口：定义支付行为
interface PaymentStrategy {
    void pay(int amount);
}

// 具体策略：支付宝支付
class AlipayPaymentStrategy implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("使用支付宝支付：" + amount + "元");
    }
}

// 具体策略：微信支付
class WeChatPaymentStrategy implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("使用微信支付：" + amount + "元");
    }
}

// 具体策略：银行卡支付
class BankCardPaymentStrategy implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("使用银行卡支付：" + amount + "元");
    }
}

// 上下文：用于选择支付策略
class PaymentContext {
    private PaymentStrategy paymentStrategy;

    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 设置策略
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 执行支付操作
    public void executePayment(int amount) {
        paymentStrategy.pay(amount);
    }
}

// 客户端：选择支付策略并执行
class Client {
    public static void main(String[] args) {
        // 用户选择支付宝支付
        PaymentContext context = new PaymentContext(new AlipayPaymentStrategy());
        context.executePayment(100); // 输出：使用支付宝支付：100元

        // 用户选择微信支付
        context.setPaymentStrategy(new WeChatPaymentStrategy());
        context.executePayment(200); // 输出：使用微信支付：200元

        // 用户选择银行卡支付
        context.setPaymentStrategy(new BankCardPaymentStrategy());
        context.executePayment(300); // 输出：使用银行卡支付：300元
    }
}
